#include "Interface.h"

int rs232c_encode(double *volts, int volts_size, const char *msg, int size)
{
    /**
     * @brief 对输入的消息进行编码，将编码后的电压值序列存储到 volts 数组中。
     * @brief 成功时返回编码后的电压值序列的长度，失败时返回 -1。
     * @param volts 存储编码后的电压值序列的数组
     * @param volts_size volts 数组的最大长度
     * @param msg 输入的消息
     * @param size 输入的消息的长度
     */
    
    int idx = 0; // volts 的索引

    for (int i = 0; i < size; i++) // 为 msg 中的每个字符生成编码，采用字节大端序
    {
        if (idx >= volts_size) return -1;

        char c = msg[i];

        volts[idx++] = 15.0; // 起始位，逻辑“0”，对应电压值为 15 V
        for (int j = 0; j < 7; j++) // 生成 7 个数据位，对应电压值为 -15 V 或 15 V，采用位小端序
        {
            if (idx >= volts_size) return -1;

            volts[idx++] = (c & 1) ? -15.0 : 15.0;
            c >>= 1;
        }

        if (idx >= volts_size) return -1;

        volts[idx++] = -15.0; // 终止位，逻辑“1”，对应电压值为 -15 V
    }

    return idx;
}
int rs232c_decode(char *msg, int size, const double *volts, int volts_size)
{
    /**
     * @brief 对输入的电压值序列进行解码，将解码后的消息存储到 msg 数组中。
     * @brief 成功时返回解码后的消息的长度，失败时返回 -1。
     * @param msg 存储解码后的消息的数组
     * @param size msg 数组的最大长度
     * @param volts 输入的电压值序列
     * @param volts_size volts 数组的长度
     */

    int idx = 0; // msg 的索引

    int i = 0;
    while (i < volts_size) // 遍历 volts 数组
    {
        if (volts[i++] == 15.0) // 空闲状态，遇到起始位
        {
            if (i + 7 >= volts_size) return -1; // 检查剩余的电压值数量是否足够组成一个完整的数据帧
            char c = 0;
            for (int j = 0; j < 7; j++) // 读取 7 个数据位
            {
                if (volts[i++] == -15.0) // 数据位为逻辑“1”
                    c |= (1 << j); 
            }
            if (volts[i++] == -15.0) // 终止位
            {
                if (idx >= size) return -1; // 检查 msg 数组是否还有空间存储解码后的字符
                msg[idx++] = c; // 将解码后的字符存储到 msg 数组中
            }
            else // 未检测到终止位，返回错误
                return -1;
        }
    }
    return idx;
}